#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* thread_func(void* par);
void* thread_func2(void* par);
typedef struct
{
	int start;
	int end;
}for_length;
int main(void)
{
	pthread_t thread1_id,thread2_id;
	int res = 0;
	// 传递单个参数
	if((res = pthread_create(&thread1_id,NULL,thread_func,(void*)8)) != 0)
	{
		perror("create thread1 error");
		return 1;
	}
	if((res = pthread_create(&thread2_id,NULL,thread_func,(void*)6)) != 0)
	{
		perror("create thread2 error");
		return 1;
	}
	// 这里要把进程阻塞，不然进程结束，线程也会结束
	// sleep(30);
	// 主控线程调用pthread_join，自己会阻塞，直到thread1和thread2结束才会运行
	pthread_join(thread1_id,NULL);
	pthread_join(thread2_id,NULL);
	// 传递多个参数时，可以使用结构体
	for_length f1 = {1,10},f2 = {1,8};
	if((res = pthread_create(&thread1_id,NULL,thread_func2,(void*)(&f1))) != 0)
	{
		perror("create thread1 error");
		return 1;
	}
	if((res = pthread_create(&thread2_id,NULL,thread_func2,(void*)(&f2))) != 0)
	{
		perror("create thread2 error");
		return 1;
	}
	pthread_join(thread1_id,NULL);
	pthread_join(thread2_id,NULL);
	return 0;
}
/**
 * 接收单个参数
 * */
void* thread_func(void* par)
{
	// 注意因为传递时，是直接把常量的值转换成地址，一般情况下 par = 0x7fffa76962f0 指针变量是存放的地址，但是这里的情况是 par = 0x000000000006，所以直接转换就可以了
	int times = (int)par;
	for(int i = 0;i < times;i++)
	{
		sleep(1);
		printf("I am thread %li;i = %d\n",pthread_self(),i);
	}
	return (void*)NULL;
}
/**
 * 接收多个参数
 * */
void* thread_func2(void* par)
{
	// 转换成结构体指针
	for_length* times = (for_length*)par;
	for(int i = times->start;i < times->end;i++)
	{
		sleep(1);
		printf("I am thread %li;i = %d\n",pthread_self(),i);
	}
	return (void*)NULL;
}
